﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<ctype.h>
#include<errno.h>

//字符分类函数
//写⼀个代码，将字符串中的⼩写字⺟转⼤写，其他字符不变
//int main() {
//	int i = 0;
//	char arr1[] = "Hello,world!";
//	char* ret = arr1;
//	while (arr1[i]) {
//		if (islower(arr1[i]))
//			arr1[i] -= 32;
//		i++;
//	}
//	printf("%s", ret);
//	return 0;
//}

//int main() {
//	int i = 0;
//	char arr1[] = "Hello,world!";
//	char* ret = arr1;
//	while (arr1[i]) {
//		if (islower(arr1[i])) 
//			arr1[i] = toupper(arr1[i]);      //toupper将参数传进去的⼩写字⺟转⼤写
//		i++;
//	}
//	printf("%s", ret);
//	return 0;
//}

//strlen 的使⽤和模拟实现

//size_t strlen(const char* str);


//strlen的模拟实现
//计数器的方式
//size_t My_strlen(const char* str) {
//  assert(str != NULL);
//	int count = 0;
//	while (*str) {
//		str++;
//		count++;
//	}
//	return count;
//}
//
//
////指针-指针方式
//size_t My_strlen(const char* str) {
//	char* start = str;
//	assert(str);
//	while (*str) 
//		str++;
//	return str - start;
//}
//
//
////递归的写法
//size_t My_strlen(const char* str) {
//	if (*str == 0)
//		return 0;
//	else
//		return 1 + My_strlen(str + 1);
//}
//
//int main() {
//	char arr[] = "abcedef";
//	size_t len = My_strlen(arr);
//	size_t Len = My_strlen(arr + 1);
//	printf("%zd\n", len);
//	printf("%zd\n", Len);
//	return 0;
//}


//strcpy 的使⽤和模拟实现

//char* strcpy(char* des, const char* src);

//strcpy的模拟实现
//char* my_strcpy(char* dest, char* src) {
//	char* ret = dest;
//	while (*src) {
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	*dest = *src;
//	return ret;
//}
//
//char* My_strcpy(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest && src);
//	while (*dest++ = *src++) {
//		;
//	}
//	return ret;
//}
//
//int main() {
//	char arr1[] = "abcdef";
//	char arr2[20] = { 0 };
//	My_strcpy(arr2, arr1);
//	printf("%s", arr2);
//	return 0;
//}

////strcat 的使⽤和模拟实现
//
//char* strcat(char* dest, const char* src);
//
////模拟实现strcat函数：
//char* my_strcat(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest && src);
//	while (*dest)
//		dest++;
//	while (*dest++ = *src++) {
//		;
//	}
//	return ret;
//}
//
//
//int main() {
//	char arr1[20] = "hello ";
//	char arr2[] = "world.";
//	my_strcat(arr1, arr2);
//	printf("%s", arr1);
//	return 0;
//}


//strcmp 的使⽤和模拟实现

//int strcmp(const char* str1, const char* str2);

//int My_strcmp(const char* str1, const char* str2) {
//	while (*str1 == *str2) {
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//	return *str1 - *str2;
//}

//int main() {
//	char arr1[] = "abcedf";
//	char arr2[] = "abcxef";
//	int ret = My_strcmp(arr1, arr2);
//	if (ret > 0)
//		printf(">");
//	else if (ret < 0)
//		printf("<");
//	else
//		printf("=");
//	printf("%d", ret);
//	return 0;
//}

//strncpy 函数的使⽤和模拟

//char* strncpy(char* destination, const char* source, size_t num);

//char* My_strncpy(char* str1, const char* str2, size_t num) {
//	while (( * str2 != '\0') && num) {
//		*str1 = *str2;
//		str1++;
//		str2++;
//		num--;
//	}
//	while (num) {
//		if (num != 0) {
//			*str1 = '\0';
//			num--;
//		}
//	}
//	return str1;
//}
//
//int main() {
//	char arr1[] = "abcdefcsdw";
//	char arr2[20] = "xxxxxxxxxxxxxxxxx";
//	My_strncpy(arr2, arr1,17);
//	char* ret = arr2;
//	printf("%s",ret);
//	return 0;
//}

//strncat 函数的使⽤和模拟

//char* strncat(char* destination, const char* source, size_t num);

char* My_strncat(char* dest, const char* sur, size_t num) {
	char* p = dest;
	while (*dest) {
		dest++;
	}
	while (( * sur != '\0') && num) {
		*dest = *sur;
		dest++;
		sur++;
		num--;
	}
	*dest = '\0';
	return dest;
}

int main() {
	char arr1[20] = "abcedef\0yyyyyy";   //从arr1中 '\0'开始追加，追加完后添加 '\0'.
	char arr2[] = " abec";
	My_strncat(arr1, arr2, 3);
	char* ret = arr1;
	printf("%s", arr1);
	return 0;
}


//strncmp函数的使⽤

//int strncmp(const char* str1, const char* str2, size_t num);

//int main() {
//	char arr1[] = "abcedf";
//	char arr2[] = "abcxef";
//	int ret = strncmp(arr1, arr2,4);
//	printf("%d", ret);
//	return 0;
//}


//strstr 的使⽤和模拟实现

//char* strstr(const char* str1, const char* str2);
//
//char* My_strstr(const char* str1, const char* str2) {
//	assert(str1 && str2);
//	const char* s1 = str1;
//	const char* s2 = str2;
//	const char* cur = str1;    //cur记录可能出现的开始匹配位置
//	if (*str2 == '\0')
//		return str1;
//	while (*cur) {
//		s1 = cur;
//		s2 = str2;
//		while (*s1 && *s2 && *s1 == *s2) {
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return cur;
//		cur++;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char str[] = "This is a simple string";
//	char* pch;
//	pch = My_strstr(str, "simple");
//	if (pch == NULL) {
//		printf("没找到");
//	}
//	else
//		printf("%s\n", pch);
//	return 0;
//}


//strtok 函数的使⽤

//char* strtok(char* str, const char* sep);

//int main() {
//	char arr1[] = "gao@qq.com";
//	char arr2[] = "@.";           //arr2指向⼀个字符串，定义了⽤作分隔符的字符集合
//	char* ret = NULL;
//	for (ret = strtok(arr1, arr2); ret != NULL; ret = strtok(NULL, arr2))
//	{
//		printf("%s\n", ret);
//	}
//	
//}

//strerror 函数的使⽤

//char* strerror(int errnum);  //strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
 
//int main()    //打印1~10的错误信息
//{
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d: %s\n", i, strerror(i));
//	}
//	return 0;
//}

//int main() {
//	FILE* pf = fopen("text.txt", "r");
//	if (pf == NULL) {
//		printf("打开失败，原因是:");
//		printf("%s\n", strerror(errno));
//		return 1;       //错误返回
//	}
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//perror函数直接返回冒号和错误原因
int main() {
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL) {
		perror("没打开，错误的原因是");
		return 1;       //错误返回
	}
	fclose(pf);
	pf = NULL;
	return 0;
